﻿using System.Linq;
using System.Windows;
using System.Windows.Input;
using LASDesktop.Classes;
using LASDesktop.LASDBClasses;

namespace LASDesktop.ModuloSocios
{

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class VisorDeSocios
    {
        private readonly LASDBDataContext _db = new LASDBDataContext();
        private readonly ISocios _parent;
        private readonly int _type;
        private readonly int _currentPartnerId;
        private readonly int _idEmpresa;

        #region Constructores

        /// <summary>
        /// Constructor para el diálogo: Agregar nuevo socio
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="idEmpresa"></param>
        public VisorDeSocios(ISocios parent, int idEmpresa)
        {
            _parent = parent;
            _type = Constants.PARTNER_VIEWER_ADD_TYPE;
            _idEmpresa = idEmpresa;
            InitializeComponent();
            SubmitButton.Content = Constants.PARTNER_VIEWER_ADD_BUTTON;
            UploadCurrencies();
            UploadTiposSocios();
            UploadCondiciones();
        }

        /// <summary>
        /// Constructor para el diálogo: Editar socio
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="socio"></param>
        /// <param name="idEmpresa"></param>
        public VisorDeSocios(ISocios parent, GetPartnersResult socio, int idEmpresa)
        {
            _parent = parent;
            _currentPartnerId = socio.IdSocio;
            _type = Constants.PARTNER_VIEWER_EDIT_TYPE;
            _idEmpresa = idEmpresa;
            InitializeComponent();
            SubmitButton.Content = Constants.PARTNER_VIEWER_EDIT_BUTTON;
            UploadCurrencies();
            UploadTiposSocios();
            UploadCondiciones();
            UploadPartner(socio);
        }
        #endregion

        /// <summary>
        /// Método que carga la lista de monedas en el combobox.
        /// </summary>
        private void UploadCurrencies()
        {
            try
            {
                var result =  _db.GetCurrencies().ToList();
                InputCurrency.ItemsSource = result;
                InputCurrency.DisplayMemberPath = "NombreMoneda";
                InputCurrency.SelectedIndex = 0;
            }
            catch
            {
                //TODO: Error
            }
        }

        /// <summary>
        /// Método que carga la lista de monedas en el combobox.
        /// </summary>
        private void UploadTiposSocios()
        {
            try
            {
                var result = _db.GetPartnerTypes().ToList();
                InputPartnerType.ItemsSource = result;
                InputPartnerType.DisplayMemberPath = "TipoSocio";
                InputCurrency.SelectedIndex = 0;
            }
            catch
            {
                //TODO: Error
            }
        }

        /// <summary>
        /// Método que carga la lista de monedas en el combobox.
        /// </summary>
        private void UploadCondiciones()
        {
            try
            {
                var result = _db.GetConditions().ToList();
                InputCondition.ItemsSource = result;
                InputCondition.DisplayMemberPath = "CondicionPago";
                InputCondition.SelectedIndex = 0;
            }
            catch
            {
                //TODO: Error
            }
        }

        /// <summary>
        /// Carga el socio al formulario.
        /// </summary>
        /// <param name="socio"></param>
        private void UploadPartner(GetPartnersResult socio)
        {
            InputCode.Text = socio.CodigoSocios;
            InputName.Text = socio.Nombre;
            InputCurrency.SelectedIndex = InputCurrency.Items.Cast<GetCurrenciesResult>().ToList().FindIndex(
                cmbi => cmbi.NombreMoneda == socio.NombreMoneda);
            InputCondition.SelectedIndex = InputCondition.Items.Cast<GetConditionsResult>().ToList().FindIndex(
                cmbi => cmbi.CondicionPago == socio.CondicionPago);
            InputPartnerType.SelectedIndex = InputPartnerType.Items.Cast<GetPartnerTypesResult>().ToList().FindIndex(
                cmbi => cmbi.TipoSocio == socio.TipoSocio);
            InputLimit.Text = socio.LimiteCredito.ToString();

        }

        
        /// <summary>
        /// Método que agrega un nuevo socio a la base de datos
        /// </summary>
        private void AddNewPartner(GetPartnersResult newPartner)
        {
            try
            {
                var idMoneda = InputCurrency.Items.Cast<GetCurrenciesResult>().ToList().Find(
                cmbi => cmbi.NombreMoneda == newPartner.NombreMoneda).IdMoneda;
                var condicionPago = InputCondition.Items.Cast<GetConditionsResult>().ToList().Find(
                cmbi => cmbi.CondicionPago == newPartner.CondicionPago).IdCondicionesPago;
                _db.InsertPartner(newPartner.CodigoSocios, newPartner.Nombre, newPartner.TipoSocio, idMoneda,
                                  newPartner.LimiteCredito, _idEmpresa, condicionPago);
                
            }
            catch
            {
                
            }
        }

        /// <summary>
        /// Método que edita un socio de la base de datos
        /// </summary>
        private void EditPartner(GetPartnersResult newPartner)
        {
            try
            {
                var idMoneda = InputCurrency.Items.Cast<GetCurrenciesResult>().ToList().Find(
                cmbi => cmbi.NombreMoneda == newPartner.NombreMoneda).IdMoneda;
                var condicionPago = InputCondition.Items.Cast<GetConditionsResult>().ToList().Find(
                cmbi => cmbi.CondicionPago == newPartner.CondicionPago).IdCondicionesPago;
                _db.UpdatePartner(_currentPartnerId, newPartner.CodigoSocios, newPartner.Nombre, newPartner.TipoSocio, idMoneda,
                                  newPartner.LimiteCredito, condicionPago);
            }
            catch
            {
                
            }

        }

        /// <summary>
        /// Método que crea un nuevo socio a partir de los datos del
        /// formulario.
        /// </summary>
        /// <returns></returns>
        private GetPartnersResult CreatePartnerFromForm()
        {
            var nuevoSocio = new GetPartnersResult
                                 {
                                     CodigoSocios = InputCode.Text,
                                     Nombre = InputName.Text,
                                     TipoSocio = ((GetPartnerTypesResult) InputPartnerType.SelectedItem).TipoSocio,
                                     NombreMoneda = ((GetCurrenciesResult) InputCurrency.SelectedItem).NombreMoneda,
                                     LimiteCredito = decimal.Parse(InputLimit.Text),
                                     CondicionPago = ((GetConditionsResult) InputCondition.SelectedItem).CondicionPago

                                 };
            return nuevoSocio;
        }


        #region GUI events
        /// <summary>
        /// Método que se dispara al presionar el botón de submit, si el tipo 
        /// del dialogo es de creacion crea el socio de lo contrario lo edita.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SubmitButtonClick(object sender, RoutedEventArgs e)
        {
            if (!IsSubmitValid()) return;

            var partner = CreatePartnerFromForm();
            
            switch (_type)
            {
                case Constants.PARTNER_VIEWER_ADD_TYPE:
                    AddNewPartner(partner);
                    break;
                case Constants.PARTNER_VIEWER_EDIT_TYPE:
                    EditPartner(partner);
                    break;
            }

            _parent.LoadPartners();
            _parent.SetOverlayVisibilityHidden();
            Close();
   
        }


        /// <summary>
        /// Método que se dispara al cerrar la ventana
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Close(object sender, MouseButtonEventArgs e)
        {
            _parent.SetOverlayVisibilityHidden();
            Close();
        }
        #endregion

        /// <summary>
        /// Método que verifica si los campos del formulario son correctos.
        /// </summary>
        /// <returns></returns>
        private static bool IsSubmitValid()
        {
            //TODO: Verificar campos vacios
            return true;
        }
    }
}